05 ADC
Analog-to-Digital Converter 模数转换器
up的视频讲解: https://space.bilibili.com/1455872040
1 ⭐️ADC 简介

ADC (Analog-to-Digital Converter) 是指将连续变量的模拟信号转换为离散的数字信号的器件
STM32F103C8t6一共有2个12位ADC(数值范围:0 ~ 4095)
-
ADC1, ADC2 (该型号无ADC3)
-
18 个信号输入的通道
-
16个外部通道:芯片上有16个引脚是可以接到模拟电压上进行电压值检测的
-
2个内部信号源 : 一个是内部温度传感器,一个是内部参考电压
-
-
各通道的A/D转换可以单次、连续、扫描或间断模式执行
-
ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中
ADC的全称是 *模数转换器 很显然他就是 *将外部的模拟信号转化为数字信号的工具 它是怎么实现的呢 我们首先对 *其中一个点进行分析
- 简单地说就是将模拟电压值,转换成对应的肉眼可读的数值
因为ADC是12bit的, 也就是说他将采集到的电压转换为了12bit数据, 但是数据寄存器是16位的, 所以说就有了左对齐和右对齐这两种方式
-
SEXTSign Extension(符号扩展位) 注入组的数据寄存器中, 用于区分正负 -
规则组的结果是无符号 12 位数据,范围 0~4095,直接用 0 填充高位
2 🔁 AD转换原理
2.1 AD转换思路

当这一点的电压 输入进来之后 我们可以通过使用 上节课学习的 DAC
-
先输出一半的参考电压与它进行 比较
-
(第一次比较) 此时输入电压 大于(1) 我们设置的电压 我们就将DAC的输出 再增加一半 进行第二次比较
-
(第二次比较) 此时输入电压仍然 大于(1) 输入电压 那就再 增加一半 进行第三次比较
-
(第三次比较) 此时输入电压 小于(0) 我们设置的电压 接着我们将DAC的输出减小一半
通过这样的方式 我们就可以通过逐次简单的比较 每次排除掉一半的取值 从而不断地逼近这个输入电压 这也就是二分法查找的思想

STM32内部的 ADC也就是通过这样的方式 逐次比较 12次 也就是 12bit的精度 最终将输入电压确定到 4096分之1的参考电压范围内
-
第一位步进电压值最大 权重最高对应 高位 反之最后一位权重最小 对应 低位
-
ADC采样值的转化规则和DAC一样 分母对应的是位数
-
分子 对应的也就是具体的比较值
2.2 SAR-ADC电路

注意 STM32的ADC并不是通过上节课讲的R2R电阻网络的DAC去实现的 而是通过 一种电容阵列DAC去实现的 整个电路构成的整体 我们可以简称它为 SAR-ADC up在这里简单讲一下它的工作原理 这样我们在后面计算ADC转换时间的时候就更容易理解

在采样阶段 此时所有开关打向左边 下方的Sb开关导通 此时电容上极板连接 输入电压 下极板连接GND 构成一个充电回路 给每个电容进行充电
-
此时这里的电容之间都是并联 所以整体的电容就是每个电容之和 也就是2C
-
电容两端的电压 上极板的电位很显然此时都为 VIN 下极板电位很显然都为 0V 上极板 减下极板也就是 VIN
-
最后我们得出此时充入电容的总电荷为 2C乘VIN
Q = C x U
总电荷 等于 电容的容量 乘以 电容两端的电压

采样完成之后 所有开关打向右边 接地 上方的Sa打向 参考电压 下方的Sb断开 进入逐次比较阶段
-
此时第一个开关打向左边 连接参考电压 这时候第一个电容的上极板电位 为参考电压Vref 其他电容的上极板电位 为0V
-
而下极板浮空 电容两端并没有形成充放电的闭合回路 总电荷不变 但又由于第一个电容被施加了电压 此时第一个电容里面的电荷没地方跑 只能往其他电容跑了 这时候下级板的电位就会发生变化 我们假设它为 Vx
-
我们来求一下这个Vx 假设第一个电容里的电荷为 Q1 其他的电容里的电荷为Q2 那么Q1就等于 第一个电容的容值C 乘以电容两端电压 Vref减去Vx 接着 Q2就等于 其他电容的容值之和为C 两端电压为 0减去Vx 最终总电荷不变 等于2C乘Vin
最后 我们简单移项合并一下就可以得到 Vx就等于二分之一的参考电压 减去输入电压

如果我们用同样的方式 去计算第二个开关对应的情况 我们就可以得到Vx为四分之一的参考电压 减去输入电压

所以我们可以总结一下规律 每往 右走一位 就对应减少一半的输出值进行比较
- 第一个开关对应的是 二分之一的参考电压
- 第二个对应的 是四分之一
- 第三个也就是 8分之一
- 第12个也就是 4096分之一
很显然第一位的权重最高 对应的 是高位 反之最后一位权重最低 对应的 是低位

我们继续往下看
-
电容下极板 Vx会继续往下 输入到下方的运放进行比较
-
运放的 反相端接地 那么当Vx小于0的时候 就会输出0 当Vx大于0的时候 就会输出1
-
接着后方的 D触发器 在每来一个ADC时钟 就会将比较器的输出值进行锁存
-
当比较器输出0的时候 锁存的值Q为0 Q反为1 此时输入电压大于比较电压 对应的开关保持
-
当比较器输出为1的时候 此时输入电压小于比较电压 对应开关断开
-
于此同时 D触发器的Q反 会存到 后面的SAR寄存器里面
-
当存满 12位以后 SAR寄存器就会将他拷贝到ADC对应的DR寄存器里面
这就是整个 SAR ADC电路的硬件原理
3 ➗️ADC转换计算公式
3.1 ADC 采样值计算

ADC 转换精度
STM32的工作电压(0 ~ 3.3V), 它的ADC精度是12位(0 ~ 4095)
-
也就是说可以将0到3.3v分成4096个单位, 而一个单位电压就是ADC的精度
-
ADC精度 计算公式: 3.3 / 4096 = 0.0008 V
ADC值 -> 测量电压值
- 计算公式: 测量电压值 = ADC值 * (3.3/4096)
3.2 ADC 采样率计算

ADC采样周期 就是 ADC完成一次 整个采样转换 所花费的时间
T = 采样周期 + 12.5个周期(固定)
-
其中1周期为1/ADCCLK
-
采样周期可以选择: 1.5 周期 7.5 周期 13.5 周期 28.5 周期 41.5 周期 55.5 周期 71.5 周期 239.5 周期
-
采样周期越长,采集越稳,但采样速度变慢
接下来 我们再看到ADC的转化时间的计算
-
这里的Tconv 也就是 ADC每次转换所需要的时间 它等于 采样时间加上12.5个时钟周期
-
这里的 采样时间 就对应 SAR ADC电路的采样阶段 也就是给每个电容充电的时间 STM32一共可以 配置 8种采样时间 最小是1.5个时钟周期 最大是239.5个时钟周期
-
后面的 12.5个时钟周期里的 其中 12对应着12次比较 每次比较消耗一个时钟周期
-
后面的 0.5个周期是每次采样前需要对整个电路进行复位所消耗的半个时钟周期
这里的cycles 是ADC工作的时钟周期 我们需要 具体看到RCC的时钟树 时钟树 最下面有专门通过ADC分频器给到ADC外设的工作时钟
ADC工作的时钟频率是有限制的 在数据手册中说明 ADC时钟频率的 最大值为14Mhz

我们来计算一下整个ADC理论上能到达的最高采样率
- 假设采样时间为 最小的1.5个时钟周期
- 那么每次ADC总转换时间 就为 14个时钟周期
- ADC最高工作频率 是14Mhz 时钟周期就是频率的倒数 1/14Mhz
最后 我们就可以算出一次转换所需要的时间为 1us 也就是最高采样率为1Mhz
4 🌐ADC外设结构
4.1 寄存器简介

我们先大致了解下ADC的框架结构, 它的工作流程:
信号输入通道-> ADC触发 -> ADC转换 -> ADC转换完成标志 -> CPU读取ADC数据值
- ADC 输入通道
-
外部通道:
ADCx_IN0~ADCx_IN15,对应芯片上的 GPIO 引脚 -
内部通道:片内温度传感器
TEMP Sensor、内部参考电压VREFINT,只能由 ADC1 采集 -
VDDA/VSSA给 ADC 供电,VREF+/VREF-是转换的参考电压,决定量程 -
Analog MUX(模拟多路器):像一个开关,切换选中的通道
- ADC 触发方式
-
EXTRIG规则组触发:控制常规通道的转换启动 -
JEXTRIG注入组触发:控制高优先级注入通道的转换启动,可打断规则组
- ADC 转换
-
ADCCLKADC时钟:由预分频器提供,决定转换速度上限(最大14MHz) -
规则通道(最多 16 个):常规采集
-
注入通道(最多 4 个):高优先级采集(相当于规则通道的中断)
- ADC 转换完成标志
-
EOC:规则通道转换完成。
-
JEOC:注入通道转换完成。
-
AWD:模拟看门狗事件
- ADC 数据寄存器
-
regular Channels规则组数据寄存器:只有 1 个 16 位寄存器 -
Injected Channels注入组数据寄存器:4 个独立的 16 位寄存器 -
CPU 直接读取寄存器,通过
Address/Data BUS地址 / 数据总线获取数据 -
DMA 请求:规则组转换完成后自动触发 DMA,将数据直接搬运到内存,无需 CPU 干预
-
对齐方式:支持左对齐 / 右对齐,决定 12 位数据在 16 位寄存器中的存放位置
4.2 外设工作流程
最后我们再简单看一下 整个ADC外设
-
中间的 这个AD转换器就是刚才讲的SAR ADC电路 RCC分频后的ADC时钟 作为它的工作基准
-
左下角的 触发源 每来一次触发就会让SAR ADC电路进行一次转换
-
左边 就对应着 输入的通道 每次只能通过 多路选择器选择其中一个通道输入到后面 SARADC电路中进行转换
-
转换完成之后 就会拷贝到 DR寄存器中 此时会将 对应的 EOC标志位置为1 然后CPU就可以对JDR寄存器中的数据 进行读取
-
还有一个阈值看门狗 我们可以设定最大最小的阈值 ADC采样后的结果就直接可以通过这个硬件进行比较 而不用等到CPU来处理
OK 这就是整个ADC大体的工作流程 需要注意的是 在大量的数据采集的时候 我们往往不会通过CPU去处理ADC的数据 而是 通过DMA去将数据搬运到内存RAM中
SAR ADC电路每转换完成之后 就可以向DMA发出DMA请求 然后DMA就可以 通过APB总线 将DR中的数据搬运到内存RAM中
-
单次转换模式:ADC只执行一次转换
-
连续转换模式:转换结束之后马上开始新的转换
-
扫描模式:多通道依次轮询采集
-
间断模式:触发一次,转换一个通道,再触发,再转换
其中 通道又可以分为 规则通道 和 注入通道这两种
对于规则通道 每来一个触发信号就进行转换 12位转换完成之后 内部的SAR寄存器就会拷贝到上方的DR寄存器中 并将 EOC标志位置为1
而对于注入通道 就可以对当前规则通道的转换进行抢占 当注入通道的触发信号来的时候 SAR ADC电路会立即复位 来处理注入通道的转换
✅分辨率不等于测量精度
12位ADC有4096个码,码值为0~4095。理想量化步长约为VREF/4096;把满码线性映射到VREF时也常见除4095的工程近似,两者使用假设不同,不要把端点拟合当成ADC真实的量化边界。
总转换时间为(采样周期+12.5)/fADC。采样电容必须有足够时间通过信号源阻抗充电,采样时间越短不一定越好。先校准,再用已知直流电压检查均值、抖动和饱和,最后才读传感器。
连续转换模式表示上一次转换后马上开始下一次;定时器等间隔触发通常关闭Continuous。需要FFT时,采样率由触发源决定,不能拿ADC内部时钟直接代入频率公式。